#pragma once

#include <struct/query_context.hpp>
#include <data/sql/sql_expr.hpp>

namespace blitz_query_cpp
{
    template <class RendererT>
    class render_sql
    {
    public:

        void process(query_context &context)
        {
            if (context.data.contains("sql"))
                return;
            auto sql_expr_iter = context.objects.find("sql_expr");

            if(sql_expr_iter == context.objects.end())
                return;

            if (const sql::sql_expr_t *pexpr = std::any_cast<sql::sql_expr_t>(&sql_expr_iter->second))
            {
                RendererT renderer;
                if (!renderer.render(*pexpr))
                {
                    context.report_error(std::string("render_sql: ") + renderer.get_error_msg());
                    return;
                }

                std::string sql = renderer.get_string();
                context.data["sql"] = std::move(sql);
            }
        }
    };
}
